Get Bitcoin data

btc <- getSymbols(Symbols="BTC-CAD", auto.assign=FALSE)
## remove today
btc <- btc[1:nrow(btc)-1,]
summary(btc)
##      Index             BTC-CAD.Open    BTC-CAD.High    BTC-CAD.Low   
##  Min.   :2019-09-18   Min.   : 6996   Min.   : 7439   Min.   : 5721  
##  1st Qu.:2020-02-17   1st Qu.:11482   1st Qu.:11703   1st Qu.:11261  
##  Median :2020-07-19   Median :13527   Median :13698   Median :13154  
##  Mean   :2020-07-19   Mean   :24778   Mean   :25458   Mean   :24027  
##  3rd Qu.:2020-12-19   3rd Qu.:29650   3rd Qu.:30704   3rd Qu.:28960  
##  Max.   :2021-05-21   Max.   :79624   Max.   :81446   Max.   :77726  
##                       NA's   :4       NA's   :4       NA's   :4      
##  BTC-CAD.Close   BTC-CAD.Volume      BTC-CAD.Adjusted
##  Min.   : 6931   Min.   :1.625e+10   Min.   : 6931   
##  1st Qu.:11480   1st Qu.:2.915e+10   1st Qu.:11480   
##  Median :13528   Median :4.480e+10   Median :13528   
##  Mean   :24825   Mean   :4.960e+10   Mean   :24825   
##  3rd Qu.:29908   3rd Qu.:6.351e+10   3rd Qu.:29908   
##  Max.   :79598   Max.   :4.471e+11   Max.   :79598   
##  NA's   :4       NA's   :4           NA's   :4

Take a look

## basic chart_Series from quantmod
chart_Series(Cl(btc))

btc45d <- tail(btc, n=45)
summary(btc45d[,1:4])
##      Index             BTC-CAD.Open    BTC-CAD.High    BTC-CAD.Low   
##  Min.   :2021-04-07   Min.   :44588   Min.   :50866   Min.   :37107  
##  1st Qu.:2021-04-18   1st Qu.:63805   1st Qu.:65129   1st Qu.:59574  
##  Median :2021-04-29   Median :69531   Median :71173   Median :66142  
##  Mean   :2021-04-29   Mean   :67378   Mean   :69224   Mean   :64474  
##  3rd Qu.:2021-05-10   3rd Qu.:71451   3rd Qu.:73292   3rd Qu.:70128  
##  Max.   :2021-05-21   Max.   :79624   Max.   :81446   Max.   :77726  
##  BTC-CAD.Close  
##  Min.   :44890  
##  1st Qu.:62442  
##  Median :68599  
##  Mean   :66752  
##  3rd Qu.:71227  
##  Max.   :79598
chart_Series(btc45d)

Get Ethereum data

eth <- getSymbols(Symbols="ETH-CAD", auto.assign=FALSE)
## remove today - empty
eth <- eth[1:nrow(eth)-1,]
summary(eth)
##      Index             ETH-CAD.Open     ETH-CAD.High     ETH-CAD.Low    
##  Min.   :2019-09-18   Min.   : 154.6   Min.   : 164.6   Min.   : 132.5  
##  1st Qu.:2020-02-17   1st Qu.: 244.0   1st Qu.: 249.5   1st Qu.: 239.6  
##  Median :2020-07-19   Median : 352.6   Median : 368.0   Median : 345.6  
##  Mean   :2020-07-19   Mean   : 851.4   Mean   : 885.7   Mean   : 814.7  
##  3rd Qu.:2020-12-19   3rd Qu.: 807.7   3rd Qu.: 825.8   3rd Qu.: 776.4  
##  Max.   :2021-05-21   Max.   :5050.3   Max.   :5267.4   Max.   :4588.7  
##                       NA's   :4        NA's   :4        NA's   :4       
##  ETH-CAD.Close    ETH-CAD.Volume      ETH-CAD.Adjusted
##  Min.   : 154.9   Min.   :6.923e+09   Min.   : 154.9  
##  1st Qu.: 243.9   1st Qu.:1.250e+10   1st Qu.: 243.9  
##  Median : 354.1   Median :1.848e+10   Median : 354.1  
##  Mean   : 855.6   Mean   :2.353e+10   Mean   : 855.6  
##  3rd Qu.: 812.7   3rd Qu.:2.971e+10   3rd Qu.: 812.7  
##  Max.   :5043.1   Max.   :1.025e+11   Max.   :5043.1  
##  NA's   :4        NA's   :4           NA's   :4

Take a look

## basic chart_Series from quantmod
chart_Series(Cl(eth))

Zoom in recent periods

  • 90d
eth90d <- tail(eth, n=90)
summary(eth90d[,1:4])
##      Index             ETH-CAD.Open   ETH-CAD.High   ETH-CAD.Low  
##  Min.   :2021-02-21   Min.   :1799   Min.   :1870   Min.   :1656  
##  1st Qu.:2021-03-15   1st Qu.:2237   1st Qu.:2286   1st Qu.:2123  
##  Median :2021-04-06   Median :2627   Median :2688   Median :2520  
##  Mean   :2021-04-06   Mean   :2856   Mean   :2983   Mean   :2709  
##  3rd Qu.:2021-04-28   3rd Qu.:3269   3rd Qu.:3424   3rd Qu.:2991  
##  Max.   :2021-05-21   Max.   :5050   Max.   :5267   Max.   :4589  
##  ETH-CAD.Close 
##  Min.   :1798  
##  1st Qu.:2237  
##  Median :2635  
##  Mean   :2862  
##  3rd Qu.:3268  
##  Max.   :5043
chart_Series(eth90d)

  • 45d
eth45d <- tail(eth, n=45)
summary(eth45d[,1:4])
##      Index             ETH-CAD.Open   ETH-CAD.High   ETH-CAD.Low  
##  Min.   :2021-04-07   Min.   :2484   Min.   :2628   Min.   :2361  
##  1st Qu.:2021-04-18   1st Qu.:2897   1st Qu.:2959   1st Qu.:2650  
##  Median :2021-04-29   Median :3306   Median :3433   Median :3014  
##  Mean   :2021-04-29   Mean   :3509   Mean   :3690   Mean   :3302  
##  3rd Qu.:2021-05-10   3rd Qu.:4226   3rd Qu.:4346   3rd Qu.:3952  
##  Max.   :2021-05-21   Max.   :5050   Max.   :5267   Max.   :4589  
##  ETH-CAD.Close 
##  Min.   :2487  
##  1st Qu.:2933  
##  Median :3304  
##  Mean   :3515  
##  3rd Qu.:4229  
##  Max.   :5043
chart_Series(eth45d)

Correlation: BTC, ETH

kryptos <- merge(btc, eth, join='outer', fill=NA)
kryptos2017 <- kryptos['2017-01-01/'] 
chart_Series(kryptos[,c(4,8)])

kryptos_all <- kryptos
kryptos <- kryptos["2017-01-01/"]
chart.Correlation(kryptos[,c(4,10)], histogram=TRUE)

Explore Correlation

df_kryptos <- as.data.frame(kryptos)
df_kryptos$date <- row.names(df_kryptos)
df_kryptos %>% ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close))+geom_point()

df_kryptos <- df_kryptos %>% mutate(
  yr=year(date),
  mth=month(date)
)
df_kryptos %>% ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close, color=as.factor(yr)))+geom_point()

Correlations vary by year. Of most relevance in most recent yr correlation.

2020

df_kryptos_2020 <- df_kryptos %>% filter(date>='2020-01-01' & date<='2020-12-31')
df_kryptos_2020 %>%
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close))+geom_point()+
  geom_smooth(method='lm')

By Month

df_kryptos_2020 %>%
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close, color=as.factor(mth)))+geom_point()+
  geom_smooth(method='lm')

df_kryptos_2020 %>% 
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close))+geom_point(aes(color=as.factor(mth)))+
  geom_smooth(method='lm')

chart.Correlation(df_kryptos_2020[,c(2,3,4,5,8,9,10,11)], histogram=TRUE)

2021

df_kryptos_2021 <- df_kryptos %>% filter(date>='2021-01-01' & date<='2021-12-31')
df_kryptos_2021 %>%
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close))+geom_point()+
  geom_smooth(method='lm')

By Month

df_kryptos_2021 %>%
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close, color=as.factor(mth)))+geom_point()+
  geom_smooth(method='lm')

df_kryptos_2021 %>% 
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close))+geom_point(aes(color=as.factor(mth)))+
  geom_smooth(method='lm')

Distribution

2020

Prices

BTC
df_kryptos_2020 %>% ggplot(aes(x=as.factor(mth), y=BTC.CAD.Close))+geom_boxplot()

ETH
df_kryptos_2020 %>% ggplot(aes(x=as.factor(mth), y=ETH.CAD.Close))+geom_boxplot()

Returns

BTC
kryptos2020 <- kryptos_all["2020-01-01/2020-12-31"]
kryptos2020_btc_ret <- dailyReturn(kryptos2020$BTC.CAD.Close)
dygraph(kryptos2020_btc_ret)
kryptos2020_btc_ret %>% ggplot(aes(x=.))+geom_histogram()+
  geom_vline(xintercept = mean(kryptos2020_btc_ret))

ETH
kryptos2020 <- kryptos_all["2020-01-01/2020-12-31"]
kryptos2020_eth_ret <- dailyReturn(kryptos2020$ETH.CAD.Close)
dygraph(kryptos2020_eth_ret)
kryptos2020_eth_ret %>% ggplot(aes(x=.))+geom_histogram()+
  geom_vline(xintercept = mean(kryptos2020_eth_ret))

Combined
kryptos2020_ret <- merge(kryptos2020_btc_ret, kryptos2020_eth_ret, join='outer', fill=NA)

dygraph(kryptos2020_ret)
## convert to data frame for scatterplots etc
df_kryptos_2020_ret <- as.data.frame(kryptos2020_ret)
colnames(df_kryptos_2020_ret) <- c("BTC_ret","ETH_ret")
ggplot(df_kryptos_2020_ret, aes(x=BTC_ret, y=ETH_ret))+geom_point()+
  geom_smooth(method='lm')

df_kryptos_2020_ret %>% ggplot(aes(x=BTC_ret))+geom_histogram()+
  geom_vline(xintercept=sd(df_kryptos_2020_ret$BTC_ret), color='blue')+
  geom_vline(xintercept=mean(df_kryptos_2020_ret$BTC_ret), color='green')+
  geom_vline(xintercept=0-sd(df_kryptos_2020_ret$BTC_ret), color='blue')+
  geom_text(aes(label=round(sd(BTC_ret),3)), color='blue', 
                x=sd(df_kryptos_2020_ret$BTC_ret), y=70, hjust= -0.1)+
  geom_text(aes(label=round(mean(BTC_ret),3)), color='blue',
            x=mean(df_kryptos_2020_ret$BTC_ret), y=100, hjust= -0.2)

df_kryptos_2020_ret %>% ggplot(aes(x=ETH_ret))+geom_histogram()+
  geom_vline(xintercept=sd(df_kryptos_2020_ret$ETH_ret), color='blue')+
  geom_vline(xintercept=0-sd(df_kryptos_2020_ret$ETH_ret), color='blue')+
  geom_vline(xintercept=mean(df_kryptos_2020_ret$ETH_ret), color='green')+
  geom_text(aes(label=round(sd(ETH_ret),3)), color='blue', 
                x=sd(df_kryptos_2020_ret$ETH_ret), y=70, hjust= -0.1)+
  geom_text(aes(label=round(mean(ETH_ret),3)), color='green',
            x=mean(df_kryptos_2020_ret$ETH_ret), y=100, hjust= -0.2)

2021

Prices

BTC
df_kryptos_2021 %>% ggplot(aes(x=as.factor(mth), y=BTC.CAD.Close))+geom_boxplot()

ETH
df_kryptos_2021 %>% ggplot(aes(x=as.factor(mth), y=ETH.CAD.Close))+geom_boxplot()

Returns

BTC
kryptos2021 <- kryptos_all["2021-01-01/2021-12-31"]
kryptos2021_btc_ret <- dailyReturn(kryptos2021$BTC.CAD.Close)
dygraph(kryptos2021_btc_ret)
kryptos2021_btc_ret %>% ggplot(aes(x=.))+geom_histogram()+
  geom_vline(xintercept = mean(kryptos2021_btc_ret))

ETH
kryptos2021 <- kryptos_all["2021-01-01/2021-12-31"]
kryptos2021_eth_ret <- dailyReturn(kryptos2021$ETH.CAD.Close)
dygraph(kryptos2021_eth_ret)
kryptos2021_eth_ret %>% ggplot(aes(x=.))+geom_histogram()+
  geom_vline(xintercept = mean(kryptos2021_eth_ret))

Combined
kryptos2021_ret <- merge(kryptos2021_btc_ret, kryptos2021_eth_ret, join='outer', fill=NA)

dygraph(kryptos2021_ret)
## convert to data frame for scatterplots etc
df_kryptos_2021_ret <- as.data.frame(kryptos2021_ret)
colnames(df_kryptos_2021_ret) <- c("BTC_ret","ETH_ret")
ggplot(df_kryptos_2021_ret, aes(x=BTC_ret, y=ETH_ret))+geom_point()+
  geom_smooth(method='lm')

df_kryptos_2021_ret %>% ggplot(aes(x=BTC_ret))+geom_histogram()+
  geom_vline(xintercept=sd(df_kryptos_2021_ret$BTC_ret), color='blue')+
  geom_vline(xintercept=mean(df_kryptos_2021_ret$BTC_ret), color='green')+
  geom_vline(xintercept=0-sd(df_kryptos_2021_ret$BTC_ret), color='blue')+
  geom_text(aes(label=round(sd(BTC_ret),3)), color='blue', 
                x=sd(df_kryptos_2021_ret$BTC_ret), y=70, hjust= -0.1)+
  geom_text(aes(label=round(mean(BTC_ret),3)), color='blue',
            x=mean(df_kryptos_2021_ret$BTC_ret), y=100, hjust= -0.2)

df_kryptos_2021_ret %>% ggplot(aes(x=ETH_ret))+geom_histogram()+
  geom_vline(xintercept=sd(df_kryptos_2021_ret$ETH_ret), color='blue')+
  geom_vline(xintercept=0-sd(df_kryptos_2021_ret$ETH_ret), color='blue')+
  geom_vline(xintercept=mean(df_kryptos_2021_ret$ETH_ret), color='green')+
  geom_text(aes(label=round(sd(ETH_ret),3)), color='blue', 
                x=sd(df_kryptos_2021_ret$ETH_ret), y=70, hjust= -0.1)+
  geom_text(aes(label=round(mean(ETH_ret),3)), color='green',
            x=mean(df_kryptos_2021_ret$ETH_ret), y=100, hjust= -0.2)

PERIOD RETURNS

At the end of the day…what matters is what your return is at the end of the day. :)

df_kryptos_2021ytd <- df_kryptos_2021 %>% filter(date==min(date) | date==max(date)) %>% select(date, yr, mth, BTC.CAD.Close, ETH.CAD.Close) %>%
  mutate(BTC.CAD.ret=BTC.CAD.Close/lag(BTC.CAD.Close)-1,
         ETH.CAD.ret=ETH.CAD.Close/lag(ETH.CAD.Close)-1)

df_kryptos_2021ytd_lg <- df_kryptos_2021ytd %>% 
                          filter(date==max(date)) %>%
                          select(date, yr, mth, BTC.CAD.ret, ETH.CAD.ret) %>%
                          pivot_longer(cols=c(4:5),
                                      names_to='coin',
                                      values_to='ytd_return')

df_kryptos_2021ytd_lg %>% ggplot(aes(x=coin, y=ytd_return))+
                               geom_col()+
                              scale_y_continuous(labels=percent)

df_kryptos_2021ytd[,c(4:7)]
##            BTC.CAD.Close ETH.CAD.Close BTC.CAD.ret ETH.CAD.ret
## 2021-01-01      37393.09      929.7528          NA          NA
## 2021-05-21      45018.18     2933.2009   0.2039171    2.154818

MULTIPLE Currencies

Get data

ccurrency <- c("BTC-CAD", "ETH-CAD","LTC-CAD","BCH-CAD")

kryptos_multi <- NULL
for(c in ccurrency){
  kryptos_multi <- cbind(kryptos_multi,
                         getSymbols(Symbols=c, 
                                 from='2018-01-01', periodicity='daily', 
                                 auto.assign = FALSE)[,4])
}

Check correlations

chart.Correlation(kryptos_multi, histogram=TRUE)